/*
        修改第五章的模式查找程序，使它从一个命名文件的集合中读取输入（有文件名参数时），
        如果没有文件名参数，则从标准输入中读取输入。当发现一个匹配行时，
        是否应该将相应的文件名打印出来？
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 1000

int main(int argc, char *argv[])
{
        char line[MAXLEN];
        long lineno = 0;
        FILE *fp;
        
        if(argc < 2)
                fprintf(stderr, "error: Too few parameters\n");
        else if(argc == 2)
        {
                while(fgets(line, MAXLEN, stdin) != NULL)
                {
                        lineno++;
                        if(strstr(line, argv[1]) != NULL)
                                fprintf(stdout, "%ld: %s", lineno, line);
                }
        }
        else 
        {
                for(int i = 2; i < argc; i++)
                {
                        if((fp = fopen(argv[i], "r")) == NULL)
                        {
                                fprintf(stderr, "error: can't open %s\n", argv[i]);
                                exit(1);
                        }
                        if(ferror(stdout))
                        {
                                fprintf(stderr, "error: writing stdout\n");
                                exit(2);
                        }
                        lineno = 0;
                        fprintf(stdout, "file: %s\n", argv[i]);
                        while(fgets(line, MAXLEN, fp) != NULL)
                        {
                                lineno++;
                                if(strstr(line, argv[1]) != NULL)
                                        fprintf(stdout, "%ld : %s", lineno, line);
                        }
                        putchar('\n');
                        fclose(fp);
                }
        }
        return 0;
}